home *** CD-ROM | disk | FTP | other *** search
- #ifndef MSC
-
- /* Non-MSC Version */
-
- #if (defined(M_I86CM) || defined(M_I86LM) || defined(M_I86HM))
-
- /* NOTE: These procedures should only be used for
- large data model programs (i.e., Compact, Large, Huge) */
-
- #include <stddef.h>
- #include "alloc.h"
-
- ATABLE AllocationTable [] = { /* Provide storage for block pointers */
- 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL,
- 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL,
- 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL, 0, NULL
- } ;
- SUNIT TABLESIZE = sizeof (AllocationTable) / sizeof (ATABLE) ;
- SUNIT MBSize = 1024 ; /* Default allocation block size */
- SUNIT NEntry = 0 ; /* Number of table entries */
- size_t _amblksiz = 1024 ; /* MSC equivalent of MBSize. */
- /* Included here to prevent loading */
- /* of unneeded MSC modules. */
-
- void *malloc ( nbytes )
-
- size_t nbytes ; /* Number of bytes to allocate */
-
- /*
- +---------------------------------------+
- | |
- | Memory allocation procedure |
- | |
- +---------------------------------------+
- */
-
- {
- SUNIT allocsize ;
- SUNIT nu ;
- SUNIT *bptr ;
- SUNIT *FindBlock () ;
- HEADER *AllocateBlock () ;
- HEADER *Header ;
- void NormalizeMBSize () ;
- void CollapseFreeBlocks () ;
- int i ;
-
- /* Make sure allocation request is O.K. */
-
- if ( nbytes == 0 )
- return ( NULL ) ;
-
- /* Calculate number of bytes needed. */
-
- allocsize = SSIZE * (( nbytes - 1 ) / SSIZE + 1 ) ;
- if ( allocsize > MAXALLOC )
- return ( NULL ) ;
-
- /* Try to allocate memory from memory available first */
-
- for ( i = 0 ; i < NEntry ; i++ ) {
- CollapseFreeBlocks ( AllocationTable [i].Header ) ;
- if ((bptr = FindBlock (AllocationTable [i].Header,allocsize)) != NULL)
- return ( (void *) bptr ) ;
- } ;
-
- /* No block is available with enough space. Make sure
- allocation unit is correctly sized. */
-
- NormalizeMBSize () ;
-
- /* First try to expand the last block in memory if possible. */
-
- if ( NEntry > 0 ) {
- Header = AllocationTable [NEntry-1].Header ;
- if ( ExpandBlock ( Header, allocsize )) {
- AllocationTable [NEntry-1].Size = Header->BytesUsed ;
- return ( (void *) FindBlock ( Header, allocsize ) ) ;
- } ;
- } ;
-
- /* No luck. Try to allocate another block. */
-
- if ( NEntry == TABLESIZE )
- return ( NULL ) ;
- nu = MBSize * (( allocsize + HSIZE + SSIZE - 1 ) / MBSize + 1 ) ;
- Header = AllocationTable [NEntry].Header = AllocateBlock ( nu ) ;
- if ( Header == NULL )
- return ( NULL ) ;
-
- /* Return allocated memory address */
-
- AllocationTable [NEntry++].Size = Header->BytesUsed ;
- return ( (void *) FindBlock ( Header, allocsize ) ) ;
- }
-
- void far *_fmalloc ( nbytes )
-
- size_t nbytes ; /* Number of bytes to allocate */
-
- /*
- +---------------------------------------+
- | |
- | Interface to malloc (large data) |
- | |
- +---------------------------------------+
- */
-
- {
- return ( (void far *) malloc ( nbytes ) ) ;
- }
- #endif
- #endif
-